WebAssembly ์ฌ์ฉ์ ์ง์ ํ ๋น์์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ํ์ํ์ฌ WASM ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ธ๋ฐํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ, ์ฑ๋ฅ ์ต์ ํ ๋ฐ ํฅ์๋ ์ ์ด ๊ธฐ๋ฅ์ ํ์ฉํด ๋ณด์ธ์.
WebAssembly ์ฌ์ฉ์ ์ง์ ํ ๋น์: ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ต์ ํ
WebAssembly(WASM)๋ ํ๋ ์น ๋ธ๋ผ์ฐ์ ๋ฐ ๊ธฐํ ํ๊ฒฝ์์ ์คํ๋๋ ๊ณ ์ฑ๋ฅ์ ์ด์ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๊ธฐ์ ๋ก ๋ถ์ํ์ต๋๋ค. WASM ๊ฐ๋ฐ์ ์ค์ํ ์ธก๋ฉด ์ค ํ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋๋ค. WASM์ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ณตํ์ง๋ง, ๊ฐ๋ฐ์๋ ์ข ์ข ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๊ณ ํด์ ๋๋ ๋ฐฉ์์ ๋ ์ธ๋ฐํ๊ฒ ์ ์ดํด์ผ ํฉ๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ์ฌ์ฉ์ ์ง์ ํ ๋น์๊ฐ ์ญํ ์ ํฉ๋๋ค. ์ด ๊ธ์์๋ WebAssembly ์ฌ์ฉ์ ์ง์ ํ ๋น์์ ๊ฐ๋ , ์ด์ , ๊ทธ๋ฆฌ๊ณ ์ค์ ๊ตฌํ ์ ๊ณ ๋ ค ์ฌํญ์ ํ๊ตฌํ๋ฉฐ ๋ชจ๋ ๋ฐฐ๊ฒฝ์ ๊ฐ๋ฐ์์๊ฒ ์ ์ธ๊ณ์ ์ผ๋ก ๊ด๋ จ๋ ๊ด์ ์ ์ ๊ณตํฉ๋๋ค.
WebAssembly ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ ์ดํดํ๊ธฐ
์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ์ดํด๋ณด๊ธฐ ์ ์ WASM์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. WASM ์ธ์คํด์ค๋ ๋จ์ผ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ด๋ ์ฐ์์ ์ธ ๋ฐ์ดํธ ๋ธ๋ก์ ๋๋ค. ์ด ๋ฉ๋ชจ๋ฆฌ๋ WASM ์ฝ๋์ ํธ์คํธ ํ๊ฒฝ(์: ๋ธ๋ผ์ฐ์ ์ JavaScript ์์ง) ๋ชจ๋์์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ด๊ธฐ ํฌ๊ธฐ์ ์ต๋ ํฌ๊ธฐ๋ WASM ๋ชจ๋ ์ปดํ์ผ ๋ฐ ์ธ์คํด์คํ ์ค์ ์ ์๋ฉ๋๋ค. ํ ๋น๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ฉด ์คํ์ ์ค๋จ์ํค๋ ๋ฐํ์ ์ค๋ฅ์ธ ํธ๋ฉ(trap)์ด ๋ฐ์ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก WASM์ ๋์์ผ๋ก ํ๋ ๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด(C/C++, Rust ๋ฑ)๋ C ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ(libc)์ malloc ๋ฐ free์ ๊ฐ์ ํ์ค ๋ฉ๋ชจ๋ฆฌ ํ ๋น์๋ ๊ทธ์ ์์ํ๋ Rust์ ํ ๋น์์ ์์กดํฉ๋๋ค. ์ด๋ฌํ ํ ๋น์๋ ์ผ๋ฐ์ ์ผ๋ก Emscripten์ด๋ ๋ค๋ฅธ ํด์ฒด์ธ์ ์ํด ์ ๊ณต๋๋ฉฐ WASM ์ ํ ๋ฉ๋ชจ๋ฆฌ ์์์ ๊ตฌํ๋ฉ๋๋ค.
์ ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ์ฌ์ฉํ๋๊ฐ?
๊ธฐ๋ณธ ํ ๋น์๋ง์ผ๋ก๋ ์ถฉ๋ถํ ๊ฒฝ์ฐ๊ฐ ๋ง์ง๋ง, WASM์์ ์ฌ์ฉ์ ์ง์ ํ ๋น์ ์ฌ์ฉ์ ๊ณ ๋ คํด์ผ ํ ๋ช ๊ฐ์ง ๊ฐ๋ ฅํ ์ด์ ๊ฐ ์์ต๋๋ค:
- ์ฑ๋ฅ ์ต์ ํ: ๊ธฐ๋ณธ ํ ๋น์๋ ๋ฒ์ฉ์ ์ด๋ฉฐ ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์๊ตฌ์ ์ต์ ํ๋์ด ์์ง ์์ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํจํด์ ๋ง๊ฒ ์กฐ์ ํ์ฌ ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ด๋์ด๋ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์์ ๊ฐ์ฒด๋ฅผ ์์ฃผ ํ ๋นํ๊ณ ํด์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ฒด ํ๋ง(object pooling)์ ์ฌ์ฉํ์ฌ ์ค๋ฒํค๋๋ฅผ ์ค์ด๋ ์ฌ์ฉ์ ์ง์ ํ ๋น์์ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๊ฐ์: ๊ธฐ๋ณธ ํ ๋น์๋ ์ข ์ข ๊ฐ ํ ๋น๊ณผ ๊ด๋ จ๋ ๋ฉํ๋ฐ์ดํฐ ์ค๋ฒํค๋๋ฅผ ๊ฐ์ง๋๋ค. ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ ์ด ์ค๋ฒํค๋๋ฅผ ์ต์ํํ์ฌ WASM ๋ชจ๋์ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ผ ์ ์์ต๋๋ค. ์ด๋ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ๋ ์๋ฒ ๋๋ ์์คํ ๊ณผ ๊ฐ์ด ๋ฆฌ์์ค๊ฐ ์ ํ๋ ํ๊ฒฝ์์ ํนํ ์ค์ํฉ๋๋ค.
- ๊ฒฐ์ ๋ก ์ ๋์: ๊ธฐ๋ณธ ํ ๋น์์ ๋์์ ๊ธฐ๋ฐ ์์คํ ๋ฐ libc ๊ตฌํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ ๋ ๊ฒฐ์ ๋ก ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ด๋ ์ค์๊ฐ ์์คํ ์ด๋ ๋ธ๋ก์ฒด์ธ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ฐ์ด ์์ธก ๊ฐ๋ฅ์ฑ์ด ๊ฐ์ฅ ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์์ ์ ๋๋ค.
- ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ด: WASM์๋ ๋ด์ฅ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์์ง๋ง, ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ง์ํ๋ AssemblyScript์ ๊ฐ์ ์ธ์ด๋ ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋น์ง ์ปฌ๋ ์ ํ๋ก์ธ์ค๋ฅผ ๋ ์ ๊ด๋ฆฌํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์ธ์ ๋ฐ์ํ๊ณ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ํ์๋๋์ง์ ๋ํ ๋ ์ธ๋ฐํ ์ ์ด๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ๋ณด์: ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ ๊ฒฝ๊ณ ๊ฒ์ฌ(bounds checking) ๋ฐ ๋ฉ๋ชจ๋ฆฌ ํฌ์ด์ฆ๋(memory poisoning)๊ณผ ๊ฐ์ ๋ณด์ ๊ธฐ๋ฅ์ ๊ตฌํํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์์ ์ทจ์ฝ์ ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํด์ ๋ฅผ ์ ์ดํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ฒํผ ์ค๋ฒํ๋ก ๋ฐ ๊ธฐํ ๋ณด์ ๊ณต๊ฒฉ์ ์ํ์ ์ค์ผ ์ ์์ต๋๋ค.
- ๋๋ฒ๊น ๋ฐ ํ๋กํ์ผ๋ง: ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ์ง์ ๋ฉ๋ชจ๋ฆฌ ๋๋ฒ๊น ๋ฐ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ํตํฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ ๋จํธํ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ๋ ๊ณผ์ ์ ํฌ๊ฒ ์ฉ์ดํ๊ฒ ํ ์ ์์ต๋๋ค.
์ฌ์ฉ์ ์ง์ ํ ๋น์์ ์ข ๋ฅ
WASM์์ ๊ตฌํํ ์ ์๋ ์ฌ๋ฌ ๊ฐ์ง ๋ค๋ฅธ ์ ํ์ ์ฌ์ฉ์ ์ง์ ํ ๋น์๊ฐ ์์ผ๋ฉฐ, ๊ฐ๊ฐ ๊ณ ์ ํ ์ฅ๋จ์ ์ด ์์ต๋๋ค:
- ๋ฒํ ํ ๋น์(Bump Allocator): ๊ฐ์ฅ ๊ฐ๋จํ ์ ํ์ ํ ๋น์์ธ ๋ฒํ ํ ๋น์๋ ๋ฉ๋ชจ๋ฆฌ ๋ด ํ์ฌ ํ ๋น ์์น์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ ์งํฉ๋๋ค. ์๋ก์ด ํ ๋น์ด ์์ฒญ๋๋ฉด ํฌ์ธํฐ๋ ๋จ์ํ ํ ๋น ํฌ๊ธฐ๋งํผ ์ฆ๊ฐํฉ๋๋ค. ๋ฒํ ํ ๋น์๋ ๋งค์ฐ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด์ง๋ง, ์๋ช ์ด ์๋ ค์ ธ ์๊ณ ํ ๋ฒ์ ๋ชจ๋ ํด์ ๋๋ ํ ๋น์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋จ์ผ ํจ์ ํธ์ถ ๋ด์์ ์ฌ์ฉ๋๋ ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ ๋นํ๋ ๋ฐ ์ด์์ ์ ๋๋ค.
- ์์ ๋ชฉ๋ก ํ ๋น์(Free-List Allocator): ์์ ๋ชฉ๋ก ํ ๋น์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก ๋ชฉ๋ก์ ์ ์งํฉ๋๋ค. ์๋ก์ด ํ ๋น์ด ์์ฒญ๋๋ฉด ํ ๋น์๋ ์์ฒญ์ ์ถฉ์กฑ์ํฌ ๋งํผ ์ถฉ๋ถํ ํฐ ๋ธ๋ก์ ์์ ๋ชฉ๋ก์์ ๊ฒ์ํฉ๋๋ค. ์ ํฉํ ๋ธ๋ก์ ์ฐพ์ผ๋ฉด ์์ ๋ชฉ๋ก์์ ์ ๊ฑฐํ๊ณ ํธ์ถ์์๊ฒ ๋ฐํํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ด ํด์ ๋๋ฉด ๋ค์ ์์ ๋ชฉ๋ก์ ์ถ๊ฐ๋ฉ๋๋ค. ์์ ๋ชฉ๋ก ํ ๋น์๋ ๋ฒํ ํ ๋น์๋ณด๋ค ์ ์ฐํ์ง๋ง, ๊ตฌํ์ด ๋ ๋๋ฆฌ๊ณ ๋ณต์กํ ์ ์์ต๋๋ค. ๋ค์ํ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์์ฃผ ํ ๋นํ๊ณ ํด์ ํด์ผ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค.
- ๊ฐ์ฒด ํ ํ ๋น์(Object Pool Allocator): ๊ฐ์ฒด ํ ํ ๋น์๋ ํน์ ์ ํ์ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๊ณ ์ ๋ ์๋งํผ ํ ๋นํฉ๋๋ค. ๊ฐ์ฒด๊ฐ ์์ฒญ๋๋ฉด ํ ๋น์๋ ํ์์ ๋ฏธ๋ฆฌ ํ ๋น๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ฐ์ฒด๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ผ๋ฉด ์ฌ์ฌ์ฉ์ ์ํด ํ๋ก ๋ฐํ๋ฉ๋๋ค. ๊ฐ์ฒด ํ ํ ๋น์๋ ์๋ ค์ง ์ ํ๊ณผ ํฌ๊ธฐ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ณ ํด์ ํ๋ ๋ฐ ๋งค์ฐ ๋น ๋ฅด๊ณ ํจ์จ์ ์ ๋๋ค. ๊ฒ์ ์์ง์ด๋ ๋คํธ์ํฌ ์๋ฒ์ ๊ฐ์ด ๋์ผํ ์ ํ์ ๊ฐ์ฒด๋ฅผ ๋๋์ผ๋ก ์์ฑํ๊ณ ์๋ฉธ์ํค๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์์ ์ ๋๋ค.
- ์์ญ ๊ธฐ๋ฐ ํ ๋น์(Region-Based Allocator): ์์ญ ๊ธฐ๋ฐ ํ ๋น์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณ๊ฐ์ ์์ญ์ผ๋ก ๋๋๋๋ค. ๊ฐ ์์ญ์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฒํ ํ ๋น์๋ ์์ ๋ชฉ๋ก ํ ๋น์์ธ ์์ฒด ํ ๋น์๊ฐ ์์ต๋๋ค. ํ ๋น์ด ์์ฒญ๋๋ฉด ํ ๋น์๋ ์์ญ์ ์ ํํ๊ณ ํด๋น ์์ญ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค. ์์ญ์ด ๋ ์ด์ ํ์ํ์ง ์์ผ๋ฉด ์ ์ฒด๋ฅผ ํ ๋ฒ์ ํด์ ํ ์ ์์ต๋๋ค. ์์ญ ๊ธฐ๋ฐ ํ ๋น์๋ ์ฑ๋ฅ๊ณผ ์ ์ฐ์ฑ ์ฌ์ด์ ์ข์ ๊ท ํ์ ์ ๊ณตํฉ๋๋ค. ์ฝ๋์ ๋ค๋ฅธ ๋ถ๋ถ์์ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํจํด์ ๊ฐ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค.
WASM์์ ์ฌ์ฉ์ ์ง์ ํ ๋น์ ๊ตฌํํ๊ธฐ
WASM์์ ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก C/C++, Rust ๋๋ AssemblyScript์ ๊ฐ์ด WASM์ผ๋ก ์ปดํ์ผํ ์ ์๋ ์ธ์ด๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ํ ๋น์ ์ฝ๋๋ ์ ์์ค ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ WASM ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ํธ ์์ฉํด์ผ ํฉ๋๋ค.
๋ค์์ Rust๋ก ๊ตฌํ๋ ๋ฒํ ํ ๋น์์ ๋จ์ํ๋ ์์ ๋๋ค:
#[no_mangle
]pub extern "C" fn bump_allocate(size: usize) -> *mut u8 {
static mut ALLOCATOR_START: usize = 0;
static mut CURRENT_OFFSET: usize = 0;
static mut ALLOCATOR_SIZE: usize = 0; // Set this appropriately based on initial memory size
unsafe {
if ALLOCATOR_START == 0 {
// Initialize allocator (run only once)
ALLOCATOR_START = wasm_memory::grow_memory(1) as usize * 65536; // 1 page = 64KB
CURRENT_OFFSET = ALLOCATOR_START;
ALLOCATOR_SIZE = 65536; // Initial memory size
}
if CURRENT_OFFSET + size > ALLOCATOR_START + ALLOCATOR_SIZE {
// Grow memory if needed
let pages_needed = ((size + CURRENT_OFFSET - ALLOCATOR_START) as f64 / 65536.0).ceil() as usize;
let new_pages = wasm_memory::grow_memory(pages_needed) as usize;
if new_pages <= (CURRENT_OFFSET as usize / 65536) {
// failed to allocate needed memory.
return std::ptr::null_mut();
}
ALLOCATOR_SIZE += pages_needed * 65536;
}
let ptr = CURRENT_OFFSET as *mut u8;
CURRENT_OFFSET += size;
ptr
}
}
#[no_mangle
]pub extern "C" fn bump_deallocate(ptr: *mut u8, size: usize) {
// Bump allocators generally don't deallocate individually.
// Deallocation typically happens by resetting the CURRENT_OFFSET.
// This is a simplification and not suitable for all use cases.
// In a real-world scenario, this could lead to memory leaks if not handled carefully.
// You might add a check here to verify if the ptr is valid before proceeding (optional).
}
์ด ์์ ๋ ๋ฒํ ํ ๋น์์ ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ํฌ์ธํฐ๋ฅผ ์ฆ๊ฐ์์ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค. ํ ๋น ํด์ ๋ ๋จ์ํ๋์์ผ๋ฉฐ(์ ์ฌ์ ์ผ๋ก ์์ ํ์ง ์์), ์ผ๋ฐ์ ์ผ๋ก ์คํ์ ์ ์ฌ์ค์ ํ์ฌ ์ํ๋๋๋ฐ, ์ด๋ ํน์ ์ฌ์ฉ ์ฌ๋ก์๋ง ์ ํฉํฉ๋๋ค. ์์ ๋ชฉ๋ก ํ ๋น์์ ๊ฐ์ ๋ ๋ณต์กํ ํ ๋น์์ ๊ฒฝ์ฐ, ๊ตฌํ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ถ์ ํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๊ณ ์ด๋ฌํ ๋ธ๋ก์ ๊ฒ์ํ๊ณ ๋ถํ ํ๋ ๋ก์ง์ ๊ตฌํํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
์ค์ ๊ณ ๋ ค ์ฌํญ:
- ์ค๋ ๋ ์์ ์ฑ: WASM ๋ชจ๋์ด ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ, ์ฌ์ฉ์ ์ง์ ํ ๋น์๊ฐ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ์ง ํ์ธํด์ผ ํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฎคํ ์ค๋ ์ํ ๋ฏน๊ณผ ๊ฐ์ ๋๊ธฐํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋น์์ ๋ด๋ถ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ณดํธํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ ๋ ฌ: ์ฌ์ฉ์ ์ง์ ํ ๋น์๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ ฌํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ์ ๋ ฌ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ฑ๋ฅ ๋ฌธ์ ๋ ์ฌ์ง์ด ์ถฉ๋์ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ๋จํธํ: ์ฃผ์ ๊ณต๊ฐ ์ ์ฒด์ ์์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ด ํฉ์ด์ ธ ์์ด ํฐ ์ฐ์ ๋ธ๋ก์ ํ ๋นํ๊ธฐ ์ด๋ ค์์ง ๋ ๋จํธํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ์ค๊ณํ ๋ ๋จํธํ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ๊ณ ์ด๋ฅผ ์ํํ๊ธฐ ์ํ ์ ๋ต์ ๊ตฌํํด์ผ ํฉ๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ํฉ๊ณผ ๊ฐ์ ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ํ ๋น ์คํจ๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ์ ์ ํ ์ค๋ฅ ์ฝ๋๋ฅผ ๋ฐํํ๊ฑฐ๋ ์์ธ๋ฅผ ๋ฐ์์์ผ์ผ ํฉ๋๋ค.
๊ธฐ์กด ์ฝ๋์ ํตํฉํ๊ธฐ
๊ธฐ์กด ์ฝ๋์ ํจ๊ป ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ธฐ๋ณธ ํ ๋น์๋ฅผ ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ก ๊ต์ฒดํด์ผ ํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์ ์ง์ ํ ๋น์์ ์์ํ๋ ์ฌ์ฉ์ ์ง์ malloc ๋ฐ free ํจ์๋ฅผ ์ ์ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. C/C++์์๋ ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ ๋ง์ปค ์ต์
์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ํ ๋น์ ํจ์๋ฅผ ์ฌ์ ์ํ ์ ์์ต๋๋ค. Rust์์๋ #[global_allocator] ์์ฑ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ง์ ์ ์ญ ํ ๋น์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
์์ (Rust):
use std::alloc::{GlobalAlloc, Layout};
use std::ptr::null_mut;
struct MyAllocator;
#[global_allocator
]static ALLOCATOR: MyAllocator = MyAllocator;
unsafe impl GlobalAlloc for MyAllocator {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
bump_allocate(layout.size())
}
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
bump_deallocate(ptr, layout.size());
}
}
์ด ์์ ๋ ์ด์ ์ ์ ์๋ bump_allocate ๋ฐ bump_deallocate ํจ์๋ฅผ ์ฌ์ฉํ๋ Rust์ ์ฌ์ฉ์ ์ง์ ์ ์ญ ํ ๋น์๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. #[global_allocator] ์์ฑ์ ์ฌ์ฉํ๋ฉด Rust ์ปดํ์ผ๋ฌ์ ํ๋ก๊ทธ๋จ์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ด ํ ๋น์๋ฅผ ์ฌ์ฉํ๋๋ก ์ง์ํฉ๋๋ค.
์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ ๋ฐ ๋ฒค์น๋งํน
์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ๊ตฌํํ ํ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ฑ๋ฅ์ ๋ฒค์น๋งํนํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ธฐ ์ํด ๋ค์ํ ์์ ๋ถํ์์ ์ฌ์ฉ์ ์ง์ ํ ๋น์์ ์ฑ๋ฅ์ ๊ธฐ๋ณธ ํ ๋น์์ ๋น๊ตํด์ผ ํฉ๋๋ค. Valgrind์ ๊ฐ์ ๋๊ตฌ(์ง์ ์ ์ผ๋ก WASM ๋ค์ดํฐ๋ธ๋ ์๋์ง๋ง ๊ทธ ์์น์ ์ ์ฉ๋จ)๋ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ WASM ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ๋กํ์ผ๋งํ๋๋ก ์กฐ์ ํ ์ ์์ต๋๋ค.
๋ฒค์น๋งํน ์ ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ํ ๋น ๋ฐ ํด์ ์๋: ๋ค์ํ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋นํ๊ณ ํด์ ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉํ๋ ์ด ๋ฉ๋ชจ๋ฆฌ ์์ ์ธก์ ํฉ๋๋ค.
- ๋จํธํ: ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๋จํธํ ์ ๋๋ฅผ ์ธก์ ํฉ๋๋ค.
ํ์ค์ ์ธ ์์ ๋ถํ๊ฐ ์ค์ํฉ๋๋ค. ์ ํํ ์ฑ๋ฅ ์ธก์ ์ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํด์ ํจํด์ ์๋ฎฌ๋ ์ด์ ํ์ญ์์ค.
์ค์ ์ฌ๋ก ๋ฐ ์ฌ์ฉ ์ฌ๋ก
์ฌ์ฉ์ ์ง์ ํ ๋น์๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์ค์ WASM ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋ฉ๋๋ค:
- ๊ฒ์ ์์ง: ๊ฒ์ ์์ง์ ์ข ์ข ๊ฒ์ ๊ฐ์ฒด, ํ ์ค์ฒ ๋ฐ ๊ธฐํ ๋ฆฌ์์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํนํ ๊ฐ์ฒด ํ์ ๊ฒ์ ๊ฐ์ฒด๋ฅผ ์ ์ํ๊ฒ ํ ๋นํ๊ณ ํด์ ํ๊ธฐ ์ํด ๊ฒ์ ์์ง์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ค๋์ค ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ: ์ค๋์ค ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข ์ค๋์ค ๋ฐ ๋น๋์ค ๋ฒํผ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ ํน์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ต์ ํํ์ฌ ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ด๋์ด๋ผ ์ ์์ต๋๋ค.
- ์ด๋ฏธ์ง ์ฒ๋ฆฌ: ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข ์ด๋ฏธ์ง ๋ฐ ๊ธฐํ ์ด๋ฏธ์ง ๊ด๋ จ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด์ ์ต์ ํํ๊ณ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋๋ฅผ ์ค์ด๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ๊ณผํ ์ปดํจํ : ๊ณผํ ์ปดํจํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข ๋๊ท๋ชจ ํ๋ ฌ ๋ฐ ๊ธฐํ ์์น ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ ์ต์ ํํ๊ณ ์บ์ ํ์ฉ๋๋ฅผ ํฅ์์ํค๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ๋ธ๋ก์ฒด์ธ ์ ํ๋ฆฌ์ผ์ด์ : ๋ธ๋ก์ฒด์ธ ํ๋ซํผ์์ ์คํ๋๋ ์ค๋งํธ ๊ณ์ฝ์ ์ข ์ข WASM์ผ๋ก ์ปดํ์ผ๋๋ ์ธ์ด๋ก ์์ฑ๋ฉ๋๋ค. ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ ๊ฐ์ค ์๋น(์คํ ๋น์ฉ)๋ฅผ ์ ์ดํ๊ณ ์ด๋ฌํ ํ๊ฒฝ์์ ๊ฒฐ์ ๋ก ์ ์คํ์ ๋ณด์ฅํ๋ ๋ฐ ์ค์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ ๋ฌดํํ ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ๋ฅผ ๋ฐฉ์งํ์ฌ ๋์ ๊ฐ์ค ๋น์ฉ๊ณผ ์ ์ฌ์ ์ธ ์๋น์ค ๊ฑฐ๋ถ ๊ณต๊ฒฉ์ ๋ง์ ์ ์์ต๋๋ค.
๋๊ตฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
WASM์์ ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐ ๋์์ด ๋๋ ๋ช ๊ฐ์ง ๋๊ตฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค:
- Emscripten: Emscripten์ C/C++ ์ฝ๋๋ฅผ WASM์ผ๋ก ์ปดํ์ผํ๊ธฐ ์ํ ํด์ฒด์ธ์ ์ ๊ณตํ๋ฉฐ,
malloc๋ฐfree๊ตฌํ์ ํฌํจํ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํฉ๋๋ค. ๋ํ ๊ธฐ๋ณธ ํ ๋น์๋ฅผ ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ก ์ฌ์ ์ํ ์ ์์ต๋๋ค. - Wasmtime: Wasmtime์ WASM ๋ชจ๋์ ์คํํ๊ธฐ ์ํ ํ๋ถํ ๊ธฐ๋ฅ ์ธํธ๋ฅผ ์ ๊ณตํ๋ ๋ ๋ฆฝํ WASM ๋ฐํ์์ผ๋ก, ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ์ง์ํฉ๋๋ค.
- Rust์ Allocator API: Rust๋ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ์ ์ํ๊ณ Rust ์ฝ๋์ ์ํํ๊ฒ ํตํฉํ ์ ์๋๋ก ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ํ ๋น์ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
- AssemblyScript: AssemblyScript๋ WASM์ผ๋ก ์ง์ ์ปดํ์ผ๋๋ TypeScript์ ์ ์ฌํ ์ธ์ด์ ๋๋ค. ์ฌ์ฉ์ ์ง์ ํ ๋น์ ๋ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ง์ํฉ๋๋ค.
WASM ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ฏธ๋
WASM ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ํ๊ฒฝ์ ๊ณ์ํด์ ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ํฅํ ๊ฐ๋ฐ์๋ ๋ค์์ด ํฌํจ๋ ์ ์์ต๋๋ค:
- ํ์คํ๋ ํ ๋น์ API: ๋ค๋ฅธ ์ธ์ด์ ํด์ฒด์ธ์์ ์ฌ์ฉํ ์ ์๋ ์ด์ ๊ฐ๋ฅํ ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ๋ ์ฝ๊ฒ ์์ฑํ ์ ์๋๋ก ํ๋ ํ์คํ๋ WASM์ฉ ํ ๋น์ API๋ฅผ ์ ์ํ๋ ค๋ ๋ ธ๋ ฅ์ด ์งํ ์ค์ ๋๋ค.
- ๊ฐ์ ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ : ํฅํ WASM ๋ฒ์ ์๋ ๋ด์ฅ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ธฐ๋ฅ์ด ํฌํจ๋ ์ ์์ผ๋ฉฐ, ์ด๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์์กดํ๋ ์ธ์ด์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ ๊ฒ์ ๋๋ค.
- ๊ณ ๊ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ์ : ๋ฉ๋ชจ๋ฆฌ ์์ถ, ๋ฉ๋ชจ๋ฆฌ ์ค๋ณต ์ ๊ฑฐ, ๋ฉ๋ชจ๋ฆฌ ํ๋ง๊ณผ ๊ฐ์ WASM์ ์ํ ๊ณ ๊ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ์ ์ ๋ํ ์ฐ๊ตฌ๊ฐ ์งํ ์ค์ ๋๋ค.
๊ฒฐ๋ก
WebAssembly ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ WASM ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ต์ ํํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์๊ตฌ์ ๋ง๊ฒ ํ ๋น์๋ฅผ ์กฐ์ ํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ์ฑ๋ฅ, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฐ ๊ฒฐ์ ๋ก ์ ๋์์์ ์๋นํ ๊ฐ์ ์ ์ด๋ฃฐ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ๊ตฌํํ๋ ๋ฐ๋ ๋ค์ํ ์์๋ฅผ ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํ์ง๋ง, ํนํ ์ฑ๋ฅ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ๊ทธ ์ด์ ์ ์๋นํ ์ ์์ต๋๋ค. WASM ์ํ๊ณ๊ฐ ์ฑ์ํด์ง์ ๋ฐ๋ผ ๋์ฑ ์ ๊ตํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ์ ๊ณผ ๋๊ตฌ๊ฐ ๋ฑ์ฅํ์ฌ ์ด ํ์ ์ ์ธ ๊ธฐ์ ์ ์ญ๋์ ๋์ฑ ํฅ์์ํฌ ๊ฒ์ผ๋ก ๊ธฐ๋ํ ์ ์์ต๋๋ค. ๊ณ ์ฑ๋ฅ ์น ์ ํ๋ฆฌ์ผ์ด์ , ์๋ฒ ๋๋ ์์คํ ๋๋ ๋ธ๋ก์ฒด์ธ ์๋ฃจ์ ์ ๊ตฌ์ถํ๋ , ์ฌ์ฉ์ ์ง์ ํ ๋น์๋ฅผ ์ดํดํ๋ ๊ฒ์ WebAssembly์ ์ ์ฌ๋ ฅ์ ๊ทน๋ํํ๋ ๋ฐ ์ค์ํฉ๋๋ค.